package com.demo.common;

import java.util.Arrays;
import java.util.regex.Pattern;

/**
 * 工具类
 * @author R.X.B
 *
 */
public final class RegexUtils {
	/**
	 * 构造函数
	 */
	private RegexUtils() {
		
	}
	
	/**
     * 基于正则表达式实现通配符，支持'*' and '?'
     * @param pattern 带通配符的模式
     * @param str 要测试的字符串
     * @return 指定字符串是否满足通配符模式要求
     */
    public static boolean wildcardMatch(String pattern, String str) {
        pattern = convertToRegexPattern(pattern);
        return Pattern.matches(pattern, str);
    }

    /**
	 * 正则表达式中的特殊字符，这个数组必须保证有序，否则2分查找会出错
	 */
	private static final char[] META_CHARACTERS = { '$', '(', ')', '+', '.', '[', '\\', ']', '^', '{', '}', '|' };
		
    /**
     * 把通配符的模式转换成正则表达式模式
     * @param wildcardString 通配符的模式
     * @return 正则表达式
     */
    private static String convertToRegexPattern(String wildcardString) {
    	StringBuffer result = new StringBuffer("^");
        char[] chars = wildcardString.toCharArray();
        for (char ch : chars) {
            if (Arrays.binarySearch(META_CHARACTERS, ch) >= 0) {
                result.append("\\").append(ch);
                continue;
            }
            switch (ch) {
                case '*':
                    result.append(".*");
                    break;
                case '?':
                	result.append(".{0,1}");
                    break;
                default:
                	result.append(ch);
            }
        }
        result.append("$");
        return result.toString();
    }
    
    /**
     * 把包含正则表达式的字符串，转义
     * @param regexString 包含正则表达式的字符串
     * @return 对正则表达式转义
     */
    public static String escapeRegex(String regexString) {
    	StringBuffer result = new StringBuffer();
    	char[] chars = regexString.toCharArray();
         for (char ch : chars) {
             if (Arrays.binarySearch(META_CHARACTERS, ch) >= 0) {
                 result.append("\\");
             }
             result.append(ch);
         }
         return result.toString();
    }
}
